/*
 * Evento.java
 *
 * Created on 24 de julio de 2007, 09:02 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package aprendizajePiezas;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Billy
 */
public class Evento implements MouseListener, MouseMotionListener{
    JLabel PiezaLabel;
    JPanel chessBoard;
    public Pieza unaPieza, otraPieza;        
    Point UbicacionPadre;    
    int xAdjustment, yAdjustment, antx, anty;   
    Integer desde, hasta;    
    
    Color ColorSeleccion = Color.RED, coloranterior;    
    java.util.List <Integer> pospintados;
    java.util.List <Color> colpintados;
    
    ManejadordeTablero adminTablero;
    manejadorPiezas adminPiezas;  
    
    JLayeredPane layeredPane;
    Dimension boardSize;    
    Pieza[] piezasVivas;
     
    String coordAnterior;
    int columna, fila;
    
    JPanel panExtra;   
    JLabel etiqExtra;
    JTable jtTablaJugadas, jtTablaComentarios;
    JTextPane jtpComentarios, jtpComentar, jtpPGN;       
    JButton btnAgregarComentario;
    
    boolean exito = false;
    boolean hecomidoPieza = false;
    
    int contadordeJugadas = 0, contadorComentarios = 0;    
    String tipoPieza;
    
    /** Creates a new instance of Evento */
    public Evento(JPanel cBoard, JLayeredPane layeredPane,Dimension boardSize, String tipoPieza) {
        
        this.chessBoard = cBoard; 
        this.layeredPane = layeredPane;
        this.boardSize = boardSize;
        this.tipoPieza = tipoPieza;
        empezardeCero(tipoPieza);
        
        piezasVivas = adminPiezas.dametodasPiezas();        
    }
    
    public void empezardeCero(String tipoPieza){
        //Aqui empieza la logica
        adminTablero = new ManejadordeTablero(chessBoard);
        adminTablero.CrearTablero();                
        adminPiezas = new manejadorPiezas(chessBoard, adminTablero, this, tipoPieza);
        // Agregando las piezas de ajedrez al tablero              
        adminPiezas.IniciarPiezas(tipoPieza);    
    }
    
    public int dameContadorJugadas(){
        return contadordeJugadas;
    }
    
    // Jalando la pieza de ajedrez    
    public void mouseDragged(MouseEvent me){   
        
        if (PiezaLabel == null) return; 
            PiezaLabel.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment);
     }
 
    // Soltando la pieza de ajedrez en el tablero    
    public void mouseReleased(MouseEvent e){        
        Component c = null;    
               
        /* PiezaLabel es la pieza que estoy arrastrando*/
        if (PiezaLabel == null) return;        
        PiezaLabel.setVisible(false);
        
        if( e.getX()>0 && e.getX()<=boardSize.width && e.getY()>0 && e.getY()<=boardSize.height){            
            c =  chessBoard.findComponentAt(e.getX(), e.getY());                                   
        }        
        else{         
            /*Aqui logro evitar dejar caer la pieza fuera de los limites del tablero*/
            c =  chessBoard.findComponentAt(UbicacionPadre.x, UbicacionPadre.y);                        
        } 
        
        /*........................*/        
            
                          
//        /*Si empiezo con negras*/
//         if(unaPieza.getColorPiezas()=='N' && contadordeJugadas%2 == 0){
//            System.out.println("Juegan negras");
//            c = chessBoard.findComponentAt(UbicacionPadre.x, UbicacionPadre.y);
//            JPanel pnl = (JPanel)c;
//            pnl.add(PiezaLabel);                      
//        }
//        /* En caso de blancas*/
//         if(unaPieza.getColorPiezas()=='B' && contadordeJugadas%2 == 1){
//            c = chessBoard.findComponentAt(UbicacionPadre.x, UbicacionPadre.y);
//            JPanel pnl = (JPanel)c;
//            pnl.add(PiezaLabel);                      
//        }        
//        /*........................*/
        
        if (c instanceof JLabel){                                 
             if( movimientoCorrecto(getComponentPosition(c))== true){
              /* Si caigo sobre una pieza y la como, tomo la posicion */                       
                 Container parent = c.getParent();
                 parent.remove(0);
                 parent.add( PiezaLabel );                 
                 /*Procedo a marcar la pieza tomada como comida*/   
                 JLabel lbl = (JLabel)c;
                 Pieza laPieza = adminPiezas.damePieza(lbl.getName());
                 /*viernes 25 de enero del 2008*/
                 laPieza.dameIcono().setVisible(false);
                 laPieza.setVivo(false);                 
          
//                 contadordeJugadas++;
//                 exito = true;        
                 hecomidoPieza = true;
             }            
             else{
                 
              /* Si caigo sobre una pieza y no puedo comerla vuelvo a la anterior posicion */                     
                 c = chessBoard.findComponentAt(UbicacionPadre.x, UbicacionPadre.y);
                 JPanel pnl = (JPanel)c;
                 pnl.add(PiezaLabel);         
             }  
        }
        else{   // Analisis cuando caigo en escaque vacio (JPanel)      
            /* Si caigo sobre un escaque vacio y valido tomo esta posicion */            
            if (movimientoCorrecto(getComponentPositionPanel(c))== true){
                Container parent = (Container)c;
                parent.add( PiezaLabel );                   
                
//                contadordeJugadas++;                
//                exito = true;
                
            }
            else{/* Si caigo sobre un escaque vacio o invalido vuelvo a posicion original*/
                 c = chessBoard.findComponentAt(UbicacionPadre.x, UbicacionPadre.y);                
                 JPanel pnl = (JPanel)c;                 
                 pnl.add(PiezaLabel);
            }            
        }
        
        PiezaLabel.setVisible(true);      
        adminTablero.PintarCasillasalSeleccionar(antx, anty, coloranterior);
        hasta=getComponentPosition(PiezaLabel);        
        String strHasta = adminTablero.dameCoordenadasSegunPosicion(hasta);
        String strDesde = adminTablero.dameCoordenadasSegunPosicion(desde);        
                
        unaPieza.setPosicion(strHasta);
        
        boolean resultadoPromocion;        
        resultadoPromocion = promocionarPeon();
                
        int tipoEnroque = adminPiezas.ProbarEnroque(unaPieza);                                                          

    }

        
  
    public void mouseClicked(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}

    //  Agregando la pieza seleccionada a la capa 'dragging' para que se pueda trasladar
    
    public void mousePressed(MouseEvent e){
        
        PiezaLabel = null;        
        antx = e.getX(); anty = e.getY();        
        Component c =  chessBoard.findComponentAt(antx, anty);                
        if (c instanceof JPanel) return;         
        UbicacionPadre = c.getParent().getLocation();
        desde = getComponentPosition(c);        
        xAdjustment = UbicacionPadre.x - e.getX();
        yAdjustment = UbicacionPadre.y - e.getY();
        PiezaLabel = (JLabel)c;        
        /*Grabo el color de la actual casilla*/
        coloranterior = c.getParent().getBackground();   
        /*Resalto con azul la pieza seleccionada*/
        c.getParent().setBackground(ColorSeleccion);        
        PiezaLabel.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);
        PiezaLabel.setSize(PiezaLabel.getWidth(), PiezaLabel.getHeight());
        layeredPane.add(PiezaLabel, JLayeredPane.DRAG_LAYER);
        /* Debo identificar primero la pieza que estoy eligiendo*/
        unaPieza = adminPiezas.IdentificarPiezaElegida(PiezaLabel, this.tipoPieza);    
        coordAnterior = unaPieza.getPosicion();
        adminTablero.CalcularCasillasalSeleccionar(unaPieza, adminPiezas);
        pospintados = adminTablero.damePosPintados();
        colpintados = adminTablero.dameColPintados();        
        //unaPieza.ImprimirMovimientos();

    }

    /* Sirve siempre y cuando arrastre un Label*/
    private Integer getComponentPosition( Component c ){
        Point UbicacionPadre = c.getParent().getLocation();
        int column = UbicacionPadre.x/c.getParent().getWidth();
        int row = UbicacionPadre.y/c.getParent().getHeight();
        int pos = row*8 + column;
        return new Integer(pos);
    }
    
    /*Este sirve para JPanel*/
    private Integer getComponentPositionPanel( Component c ){
        Point UbicacionPadre = c.getLocation();
        int column = UbicacionPadre.x/c.getWidth();
        int row = UbicacionPadre.y/c.getHeight();
        int pos = row*8 + column;
        return new Integer(pos);
    }    
    
    public boolean movimientoCorrecto(int posicion){
        for(int i=0;i<pospintados.size();i++)
            if( pospintados.get(i) == posicion ) return true;
    return false;
    }
  
    
    public boolean promocionarPeon(){
        boolean exitoPromocion = false;
        /*Por lo pronto estoy considerando cuando un peon negro promociona*/
        if (unaPieza instanceof Peon && 
            unaPieza.getPosicion().charAt(1)=='1'){    
            exitoPromocion = true;
            
            unaPieza.setPromocion(true);
            unaPieza.dameIcono().setVisible(false);
            unaPieza.setVivo(false);
            
            int pos = adminTablero.damePosicionSegunCoordenadas(unaPieza.getPosicion());               
            panExtra =(JPanel)chessBoard.getComponent(pos);               
            adminPiezas.damePieza("NegroDama2").setPosicion(unaPieza.getPosicion());             
            etiqExtra = adminPiezas.dameEtiqueta("NegroDama2");
            panExtra.add(etiqExtra);      
            etiqExtra.setVisible(true);               
            

        }     
        /*Martes, 02 de octubre del 2007. 7:29 pm (Escucho: La Boda de Ella)*/
    if (unaPieza instanceof Peon && unaPieza.getPosicion().charAt(1)=='8'){ 
            exitoPromocion = true;
            unaPieza.setPromocion(true);
            unaPieza.dameIcono().setVisible(false);
            unaPieza.setVivo(false);
            
            int pos = adminTablero.damePosicionSegunCoordenadas(unaPieza.getPosicion());               
            panExtra =(JPanel)chessBoard.getComponent(pos);               
            adminPiezas.damePieza("BlancoDama2").setPosicion(unaPieza.getPosicion());             
            etiqExtra = adminPiezas.dameEtiqueta("BlancoDama2");
            panExtra.add(etiqExtra);      
            etiqExtra.setVisible(true);  
        }    
        
      return exitoPromocion;  
    }

    private void undoEnroqueCortoNegro(){
        int pAct = adminTablero.damePosicionSegunCoordenadas("f8");               
        adminTablero.RepintarPosiciones(pAct);
        int pAnt = adminTablero.damePosicionSegunCoordenadas("h8");        
        JPanel pan2 =(JPanel)chessBoard.getComponent(pAnt);            
        adminTablero.RepintarPosiciones(pAnt);      

        adminPiezas.damePieza("NegroTorre2").setPosicion("h8");             
        JLabel etiq2 = adminPiezas.dameEtiqueta("NegroTorre2");
        pan2.add(etiq2);      
        etiq2.setVisible(true);    
    }

    private void undoEnroqueCortoBlanco(){
        int pAct = adminTablero.damePosicionSegunCoordenadas("f1");               
        adminTablero.RepintarPosiciones(pAct);
        int pAnt = adminTablero.damePosicionSegunCoordenadas("h1");        
        JPanel pan2 =(JPanel)chessBoard.getComponent(pAnt);            
        adminTablero.RepintarPosiciones(pAnt);      

        adminPiezas.damePieza("BlancoTorre2").setPosicion("h1");             
        JLabel etiq2 = adminPiezas.dameEtiqueta("BlancoTorre2");
        pan2.add(etiq2);      
        etiq2.setVisible(true);    
    }
    
    private void undoEnroqueLargoNegro(){
        int pAct = adminTablero.damePosicionSegunCoordenadas("d8");               
        adminTablero.RepintarPosiciones(pAct);
        int pAnt = adminTablero.damePosicionSegunCoordenadas("a8");        
        JPanel pan2 =(JPanel)chessBoard.getComponent(pAnt);            
        adminTablero.RepintarPosiciones(pAnt);      

        adminPiezas.damePieza("NegroTorre1").setPosicion("a8");             
        JLabel etiq2 = adminPiezas.dameEtiqueta("NegroTorre1");
        pan2.add(etiq2);      
        etiq2.setVisible(true);    
    }

    private void undoEnroqueLargoBlanco(){
        int pAct = adminTablero.damePosicionSegunCoordenadas("d1");               
        adminTablero.RepintarPosiciones(pAct);
        int pAnt = adminTablero.damePosicionSegunCoordenadas("a1");        
        JPanel pan2 =(JPanel)chessBoard.getComponent(pAnt);            
        adminTablero.RepintarPosiciones(pAnt);      

        adminPiezas.damePieza("BlancoTorre1").setPosicion("a1");             
        JLabel etiq2 = adminPiezas.dameEtiqueta("BlancoTorre1");
        pan2.add(etiq2);      
        etiq2.setVisible(true);    
    }
     
}


